package clases;

import interfaz.dlgJProgressProyecto;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author MK
 */
public class ClsProyectoSQL {

    private ClsDatabase bd = new ClsDatabase();
    private ClsMetodos metodos = new ClsMetodos();
    private dlgJProgressProyecto dialogProgressProyecto;
    private String id = null;
    private int n = 0;
    private FileWriter fichero = null;
    private PrintWriter EscribirFichero = null;
    private static String direccionDirectorioSalida = "C:\\";
//    private static String direccionDirectorioSalida=System.getProperty("user.dir")+"//portable//";
//    private static String direccionDirectorioSalida=System.getProperty("user.dir");
    private static String nombreArchivoPortable = "Portable" + ClsSesion.user;
    private String ExtensionArchivoAGuardar = ".txt";
    private String nameColumnTable = "";
    private int filasTotal = 0;
    private int registros = 0;
    private String sqlCount = "";
    private String vNameTabla = "";
    private boolean activarPaseFuncion = false;
    public static boolean bandProcessEnd = false;

    //http://luisdavidgarcias.blogspot.com/2012/09/codificacion-de-archivos-en-java.html
    public boolean escribir(String tableName, Object[][] datos, String direccion_file) {
        try {
            File file = new File(direccionDirectorioSalida);
            if (!file.exists()) {
                file.mkdirs();
            }
            fichero = new FileWriter(direccion_file, true);
            EscribirFichero = new PrintWriter(fichero);
            int columnas = nameColumnTable.split(",").length;
            String insertString = ">>>>>>>>>>>" + ClsMetodos._getFechaHoraActual() + ">>>>>>>>>>>" + ClsSesion.user + "\n";
            insertString = "--->>>[" + tableName + "]--[" + columnas + "]----------------------------------------------\n";
//            insertString+="INSERT INTO " + tableName + " (" + nameColumnTable + ") VALUES \n";
            insertString += ":(" + nameColumnTable + "):\n";
            for (int i = 0; i < filasTotal; i++) {
//                insertString+="INSERT INTO " + tableName + " (" + nameColumnTable + ") VALUES (";
                insertString += "(";
                for (int j = 0; j < n; j++) {
                    if (j != 0) {
                        insertString += ",";
                    }
                    insertString += "'" + datos[i][j] + "'";
                }
                insertString += "),\n";
            }
            EscribirFichero.println(insertString);
            fichero.close();
            EscribirFichero.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            ClsException._exceptionWriteFile(e, "escribir");
        }
        System.err.println("--->>>ERROR de escribir");
        return false;
    }
//___________________________________________________________________________________ Soy una barra separadora :)

    public boolean funcion_Proyecto(String direccionString) {
        Object[][] datosProyecto = select("proyecto", "*", "idproyecto='" + id + "' ");
        if (datosProyecto != null) {
            return escribir("proyecto", datosProyecto, direccionString);
        } else if (registros == 0) {
            return true;
        }
        return false;
    }

    public boolean funcion_Presupuesto(String direccionString) {
        Object[][] datosPresupuesto = select("proyecto pro,presupuesto pre",
                "pre.*",
                "pre.idproyecto=pro.idproyecto and pro.idproyecto='" + id + "' ");
        if (datosPresupuesto != null) {
            return escribir("presupuesto", datosPresupuesto, direccionString);
        } else if (registros == 0) {
            return true;
        }
        return false;
    }

    public boolean funcion_PresupuestoPartida(String direccionString) {
        Object[][] datosPartida = select("proyecto pro,presupuesto pre,presupuesto_partida par",
                "par.*",
                "pre.idproyecto=pro.idproyecto and pre.idpresupuesto=par.idpresupuesto and "
                + "par.idproyecto=pro.idproyecto and pro.idproyecto='" + id + "' ");
        if (datosPartida != null) {
            return escribir("partida", datosPartida, direccionString);
        } else if (registros == 0) {
            return true;
        }
        return false;
    }

    public boolean funcion4(String direccionString) {
        Object[][] datosPartida_Detalle = select("proyecto pro,presupuesto pre,partida par,partida_detalle pardet",
                "pardet.*",
                "pre.idproyecto=pro.idproyecto and pre.idpresupuesto=par.idpresupuesto and "
                + "par.idproyecto=pro.idproyecto and pardet.idproyecto=pro.idproyecto and "
                + "pardet.idpresupuesto=pre.idpresupuesto and pardet.idpartida=par.idpartida and pro.idproyecto='" + id + "' ");
        if (datosPartida_Detalle != null) {
            return escribir("partida_detalle", datosPartida_Detalle, direccionString);
        } else if (registros == 0) {
            return true;
        }
        return false;
    }

    public boolean funcion5(String direccionString) {
        sqlCount = "SELECT count(DISTINCT i.idinsumo) as total FROM ";
        activarPaseFuncion = true;
        Object[][] datosInsumos = select("proyecto pro,presupuesto pre,partida par,partida_detalle pardet,insumo i",
                "DISTINCT i.idinsumo,i.nombre,i.precio,i.idinsumo_tipo,i.idunidad,i.idinsumo_categoria,"
                + "i.subcatergoria,i.estado,i.fechaingreso,i.fechamodificado",
                "pre.idproyecto=pro.idproyecto and pre.idpresupuesto=par.idpresupuesto and "
                + "par.idproyecto=pro.idproyecto and pardet.idproyecto=pro.idproyecto and "
                + "pardet.idpresupuesto=pre.idpresupuesto and pardet.idpartida=par.idpartida "
                + "and pro.idproyecto='" + id + "' and i.idinsumo=pardet.idinsumo ");
        if (datosInsumos != null) {
            return escribir("insumo", datosInsumos, direccionString);
        } else if (registros == 0) {
            return true;
        }
        return false;
    }

    public boolean funcion_Tabla(String direccionString, String tablaString) {
        String abrev = tablaString.substring(0, 3);
        sqlCount = "SELECT count(DISTINCT " + abrev + ".id" + tablaString + ") as total FROM ";
        activarPaseFuncion = true;
        Object[][] datosInsumos = select("proyecto pro,presupuesto pre,partida par,partida_detalle pardet,insumo i," + tablaString + " " + abrev + " ",
                "DISTINCT " + abrev + ".* ",
                "pre.idproyecto=pro.idproyecto and pre.idpresupuesto=par.idpresupuesto and "
                + "par.idproyecto=pro.idproyecto and pardet.idproyecto=pro.idproyecto and "
                + "pardet.idpresupuesto=pre.idpresupuesto and pardet.idpartida=par.idpartida "
                + "and pro.idproyecto='" + id + "' and i.idinsumo=pardet.idinsumo and " + abrev + ".id" + tablaString + "=i.id" + tablaString + " ");
        if (datosInsumos != null) {
            return escribir(tablaString, datosInsumos, direccionString);
        } else if (registros == 0) {
            return true;
        }
        return false;
    }
//___________________________________________________________________________________ Soy una barra separadora :)

    public boolean CrearArchivoPortable(String file) {
        dialogProgressProyecto = new dlgJProgressProyecto(new javax.swing.JFrame(), true);
        dialogProgressProyecto.setTitle("Guardando Datos");
        dialogProgressProyecto.setVisible(true);
        dialogProgressProyecto.iniciarProgressBar();
        if (funcion_Tabla(file, "unidad")) {
            if (funcion_Tabla(file, "insumo_tipo")) {
                if (funcion_Tabla(file, "insumo_categoria")) {
                    if (funcion5(file)) {
                        if (funcion_Proyecto(file)) {
                            if (funcion_Presupuesto(file)) {
                                if (funcion_PresupuestoPartida(file)) {
                                    if (funcion4(file)) {
                                        bandProcessEnd = true;
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
//___________________________________________________________________________________ Soy una barra separadora :)

    public void GuardarArchivo_JFileChooser() {
        String file = null;
        JFileChooser fileChooser = new JFileChooser();
        FileNameExtensionFilter filtro = new FileNameExtensionFilter(ExtensionArchivoAGuardar, ExtensionArchivoAGuardar.substring(1, ExtensionArchivoAGuardar.length()));
        fileChooser.setFileFilter(filtro);
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fileChooser.setCurrentDirectory(new java.io.File(direccionDirectorioSalida));
        fileChooser.setDialogTitle("Guardar el Proyecto en:");
        int result = fileChooser.showSaveDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
            file = fileChooser.getSelectedFile().toString();
//                System.out.println(file.substring(file.length()-4, file.length()));
            if (file.substring(file.length() - 4, file.length()).equals(ExtensionArchivoAGuardar)) {
//                    System.out.println("equals="+file);
            } else {
                file = file + ExtensionArchivoAGuardar;
            }
            if (CrearArchivoPortable(file)) {
                JOptionPane.showMessageDialog(null, "Se creo el archivo portable satisfactoriamente!!!", "Se creo el archivo portable", JOptionPane.INFORMATION_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "No se pudo crear el archivo portable!!!", "Error al crear el archivo", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    public boolean RecuperarArchivo_JFileChooser() {
        String file = null;
        JFileChooser fileChooser = new JFileChooser();
        FileNameExtensionFilter filtro = new FileNameExtensionFilter(ExtensionArchivoAGuardar, ExtensionArchivoAGuardar.substring(1, ExtensionArchivoAGuardar.length()));
        fileChooser.setFileFilter(filtro);
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fileChooser.setCurrentDirectory(new java.io.File(direccionDirectorioSalida));
        fileChooser.setDialogTitle("Abrir el Archivo del Proyecto");
        int result = fileChooser.showOpenDialog(fileChooser);
        if (result == JFileChooser.APPROVE_OPTION) {
            file = fileChooser.getSelectedFile().toString();
            try {
                File f = new File(file);
                BufferedReader entrada;
                entrada = new BufferedReader(new FileReader(f));
                String linea;
                boolean nuevaTabla = false;//Para controlar el nombre de las tablas
                String nombreFields = "", idproyecto = "";
                String idTableTXT = "", idTableHashMap = "";
                dialogProgressProyecto = new dlgJProgressProyecto(new javax.swing.JFrame(), true);
                dialogProgressProyecto.setTitle("Exportando Datos");
                dialogProgressProyecto.setVisible(true);
                dialogProgressProyecto.iniciarProgressBar();
                //int iii=1;
                HashMap hashMap = new HashMap();
                HashMap vIdUnidadMap = new HashMap();
                HashMap vIdInsumo_TipoMap = new HashMap();
                HashMap vIdInsumo_CategoriaMap = new HashMap();
                HashMap vIdInsumoMap = new HashMap();
                HashMap vIdPresupuestoMap = new HashMap();
                HashMap vIdPartidasMap = new HashMap();
                while (entrada.ready()) {
                    linea = entrada.readLine();
//                    System.out.println(linea);
                    idTableTXT = "";
                    int posInicial = 0, posFinal = 0, posTemp = 0;
                    if (linea.indexOf("--->>>[") != -1 && nuevaTabla == false) {
                        posInicial = 7;
                        posFinal = linea.indexOf("]");
                        nuevaTabla = true;
                        vNameTabla = linea.substring(posInicial, posFinal);
                        if (vNameTabla.equals("insumo_tipo")) {
                            vIdUnidadMap = new HashMap(hashMap);
                        } else if (vNameTabla.equals("insumo_categoria")) {
                            vIdInsumo_TipoMap = new HashMap(hashMap);
                        } else if (vNameTabla.equals("insumo")) {
                            vIdInsumo_CategoriaMap = new HashMap(hashMap);
                        } else if (vNameTabla.equals("proyecto")) {
                            vIdInsumoMap = new HashMap(hashMap);
                        } else if (vNameTabla.equals("presupuesto")) {
                        } else if (vNameTabla.equals("partida")) {
                            vIdPresupuestoMap = new HashMap(hashMap);
                        } else if (vNameTabla.equals("partida_detalle")) {
                            vIdPartidasMap = new HashMap(hashMap);
                        }
                        hashMap.clear();
                        System.err.println("-----------------------------------------------------------------------------------");
                        System.err.println("Se encontro vNameTabla >>>: " + vNameTabla);
                    } else if (linea.indexOf(":(") != -1) {
                        posInicial = linea.indexOf(",") + 1;
                        posFinal = linea.indexOf("):");
                        nombreFields = linea.substring(posInicial, posFinal);
//                        System.out.println("nombreFields: "+nombreFields);
                    } else if (linea.indexOf("','") != -1) {
                        posInicial = linea.indexOf("','") + 3;
                        posFinal = linea.indexOf("','", posInicial + 1);
                        idTableTXT = linea.substring(1, posInicial - 2);//'12'
                        if (vNameTabla.equals("presupuesto")) {
                            posInicial = linea.indexOf("','", posFinal) + 3;
                            posFinal = linea.indexOf("','", posInicial + 1);
                            posTemp = linea.indexOf("','") + 2;
                            idTableTXT = linea.substring(posTemp, posInicial - 2);//'12'
                        } else if (vNameTabla.equals("partida")) {
                            posInicial = linea.indexOf("','", posFinal) + 3;
                            posFinal = linea.indexOf("','", posInicial + 1);
                            posInicial = linea.indexOf("','", posFinal) + 3;
                            posFinal = linea.indexOf("','", posInicial + 1);
                            posTemp = linea.indexOf("','") + 2;
                            posTemp = linea.indexOf("','", posTemp) + 2;
                            idTableTXT = linea.substring(posTemp, posInicial - 2);//'12'
                        } else if (vNameTabla.equals("partida_detalle")) {
                            String idPresupuesto = "", idPartida = "", idInsumo = "", detalle = "";
                            posInicial = linea.indexOf("','", 2) + 2;
                            posFinal = linea.indexOf("','", posInicial + 1);
                            idPresupuesto = linea.substring(posInicial, posFinal);
                            posInicial = linea.indexOf("','", posFinal) + 3;
                            idPartida = linea.substring(posFinal + 2, posInicial + 1);
                            posFinal = linea.indexOf("','", posInicial + 1);
                            posTemp = linea.lastIndexOf("','", linea.length());
                            detalle = linea.substring(posFinal + 2, posTemp + 1);
                            idInsumo = linea.substring(posTemp + 2, linea.length() - 2);
//                            System.out.println("--<<partida_detalle>> INSERT INTO "+vNameTabla+" (idproyecto,"+nombreFields+") VALUES("+idproyecto+","+vIdPresupuestoMap.get(idPresupuesto) +","+vIdPartidasMap.get(idPartida)+"," +detalle+","+vIdInsumoMap.get(idInsumo)+")");
                            bd.insert(vNameTabla, "idproyecto," + nombreFields, idproyecto + "," + vIdPresupuestoMap.get(idPresupuesto) + "," + vIdPartidasMap.get(idPartida) + "," + detalle + "," + vIdInsumoMap.get(idInsumo));
                            JOptionPane.showMessageDialog(null, "SE RESTAURO EL ARCHIVO DEL PROYECTO EXITOSAMENTE!!!", "Mensaje!!!", JOptionPane.INFORMATION_MESSAGE);
                            bandProcessEnd = true;
                            return true;
                        }
                        //Buscamos en la BD el campo "Nombre"
                        String campoABuscar = linea.substring(posInicial, posFinal);
                        String nombre = "nombre=";
                        if (vNameTabla.equals("insumo_categoria")) {
                            nombre = "descripcion=";
                        }
                        //___________________________________________________________________________________ Soy una barra separadora :)
                        String idEncontradoBD = "";
                        if (vNameTabla.equals("presupuesto") || vNameTabla.equals("partida")) {
                            idEncontradoBD = null;
                        } else {
                            idEncontradoBD = selectBD(vNameTabla, "id" + vNameTabla, nombre + "'" + campoABuscar + "'");
                        }
                        posFinal = linea.indexOf("'),") + 1;
                        if (idEncontradoBD != null) {//Si se encontro el id en la BD de la nueva PC
                            System.out.println("Si se encontro el ID: ['" + idEncontradoBD + "'] de " + vNameTabla);
                            if (vNameTabla.equals("proyecto")) {
                                String nuevoNombreProyecto = JOptionPane.showInputDialog(
                                        null,
                                        "Se encontro un Proyecto con el mismo nombre del archivo .txt\nRenombre el proyecto para continuar, o cancele",
                                        JOptionPane.QUESTION_MESSAGE);  // el icono sera una iterrogante
                                if (nuevoNombreProyecto != null) {
//                                    bd.insert(vNameTabla, nombreFields, "null,"+linea.substring(posInicial-1, posFinal));
                                    System.out.println("--<<Proyecto Duplicado>> INSERT INTO " + vNameTabla + " (idproyecto," + nombreFields + ") VALUES(null,'" + nuevoNombreProyecto + "'," + linea.substring(posFinal + 1, linea.length() - 2) + ")");
                                    String idNuevo = selectBD(vNameTabla, "id" + vNameTabla, nombre + "'" + campoABuscar + "'");
                                    System.out.println("--<<idNuevo>>" + idNuevo);
                                    idproyecto = idNuevo;
                                } else {
                                    JOptionPane.showMessageDialog(null, "Se cancelo la lectura del proyecto!!!", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
                                    return false;//Se cancela la transaccion
                                }
                            }
                            System.out.println(vNameTabla + ">>>>>SI ID>>>>>hashMap: idTableTXT:" + idTableTXT + ">>encont>>'" + idEncontradoBD + "'" + "<<<<" + vNameTabla);
                            idTableHashMap = "'" + idEncontradoBD + "'";
                            //___________________________________________________________________________________ Soy una barra separadora :)
                        } else { //Si es null, no se encontro el id en la BD
                            String idNuevo = "null";
                            switch (vNameTabla) {
                                case "insumo":
                                    idNuevo = "'" + metodos.generarCodigollaves("SELECT count(idinsumo) FROM insumo", 5) + "'";
                                    break;
                                case "insumo_categoria":
                                    idNuevo = "'" + metodos.generarCodigollaves("SELECT idinsumo_categoria FROM insumo_categoria ORDER BY idinsumo_categoria desc LIMIT 0,1", 2) + "'";
                                    break;
                            }
//                            System.out.println("<<<<<<<<<<<<<<idNuevo>>"+idNuevo);
                            if (vNameTabla.equals("insumo")) {
                                int p1 = 0, p2 = 0;
//                                System.out.println("linea: "+linea);
//                                System.out.println("<<<posInicial>>>"+(posInicial)+">>>posFinal>>>"+(posFinal)+">>>length:"+linea.length());
                                p2 = linea.indexOf("','", posInicial + 1);
//                                System.err.println("p2:"+p2);
                                p1 = linea.indexOf("','", p2 + 1);
                                String nombre_precio = linea.substring(p2 + 2, p1 + 1);
//                                System.err.println("p1:"+p1);
                                p2 = linea.indexOf("','", p1 + 1);
//                                System.err.println("p2:"+p2+">>>");
//                                System.out.println("<<<p1+2>>>"+(p1+2)+">>>p2+1>>>"+(p2+1));
                                String idinsumo_tipo = linea.substring(p1 + 2, p2 + 1);
//                                System.out.println("<<<idinsumo_tipo>>>"+p1+">>>"+idinsumo_tipo);
                                p1 = linea.indexOf("','", p2 + 3);
                                String idunidad = linea.substring(p2 + 2, p1 + 1);
//                                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<idunidad>>>"+p2+">>>"+idunidad);
                                p2 = linea.indexOf("','", p1 + 3);
//                                System.out.println("<<<p1>>>"+(p1)+">>>p2>>>"+(p2));
                                String idinsumo_categoria = linea.substring(p1 + 2, p2 + 1);
                                String otros = linea.substring(p2 + 2, linea.length() - 2);
//                                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<idinsumo_categoria>>>"+p2+">>>"+idinsumo_categoria);
//                                System.out.println("--<<idTableTXT>>"+idTableTXT+"--->>>idNuevo>>>"+idNuevo);
//                                System.out.println("--<<Insumo>> INSERT INTO "+vNameTabla+" (idinsumo,"+nombreFields+") VALUES("+idNuevo+","+nombre_precio+","+vIdInsumo_TipoMap.get(idinsumo_tipo)+"," +vIdUnidadMap.get(idunidad)+","+vIdInsumo_CategoriaMap.get(idinsumo_categoria)+","+otros+")");

                                //INSERT a la BD
                                System.out.println("--<<Insumo>> INSERT INTO " + vNameTabla + " (idinsumo," + nombreFields + ") VALUES(" + idNuevo + "," + nombre_precio + "," + vIdInsumo_TipoMap.get(idinsumo_tipo) + "," + vIdUnidadMap.get(idunidad) + "," + vIdInsumo_CategoriaMap.get(idinsumo_categoria) + "," + otros + ")");
                                bd.insert(vNameTabla, "id" + vNameTabla + "," + nombreFields, idNuevo + "," + nombre_precio + "," + vIdInsumo_TipoMap.get(idinsumo_tipo) + "," + vIdUnidadMap.get(idunidad) + "," + vIdInsumo_CategoriaMap.get(idinsumo_categoria) + "," + otros);
                            } else if (vNameTabla.equals("insumo_tipo")) {
                                Object[][] datos = bd.select("insumo_tipo", "count(*)", null);
                                int orden = Integer.parseInt(datos[0][0].toString()) + 1;
                                int p1 = linea.lastIndexOf("','", linea.length() - 4);
                                String id1 = linea.substring(p1 + 2, linea.length() - 2);
//                                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<lastindexof>>>"+p1+">>>"+id1);
                                int p2 = linea.lastIndexOf("','", p1 - 2);
//                                String id2=linea.substring(p2+2, p1+1);
//                                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<lastindexof>>>"+p2+">>>"+id2);
                                //INSERT a la BD y se generara el ID
//                                System.out.println("(insumo_tipo) VALUES("+idNuevo+","+linea.substring(posInicial-1, p2+1)+",'"+orden+"',"+id1+")");
                                bd.insert(vNameTabla, "id" + vNameTabla + "," + nombreFields, idNuevo + "," + linea.substring(posInicial - 1, p2 + 1) + ",'" + orden + "'," + id1);
//                                System.out.println("<insumo_tipo>--No ID--->INSERT INTO "+vNameTabla+" (id"+vNameTabla+","+nombreFields+") VALUES(null,"+linea.substring(posInicial-1, p2+1)+",'"+orden+"',"+id1+")");
                            } else if (vNameTabla.equals("proyecto")) {
                                int p1 = linea.lastIndexOf("','", linea.length() - 3);
//                                System.out.println("<<<<<<<<<<<<p1>>>"+p1+">>>");
                                String cadena = linea.substring(p1 + 2, linea.length() - 2);
//                                System.out.println("<<<<<<<<<<<<cadena>>>"+cadena+">>>");
                                int p2 = linea.lastIndexOf("','", p1 - 1);
//                                System.out.println("<<<<<<<<<<<<p2>>>"+p2+">>>");
                                String cadena2 = linea.substring(posInicial - 1, p2 + 1) + ",'" + ClsSesion.iduser + "'," + cadena;
//                                System.out.println("<<<<<<<<<<<<proyecto>>>"+p1+">>>"+id1);
                                //INSERT a la BD y se generara el ID
                                bd.insert(vNameTabla, "id" + vNameTabla + "," + nombreFields, idNuevo + "," + cadena2);
//                                System.out.println("<<Proyecto>>--No hay ID--->INSERT INTO "+vNameTabla+" (id"+vNameTabla+","+nombreFields+") VALUES("+idNuevo+","+cadena2+")");
                            } else if (vNameTabla.equals("presupuesto")) {
                                //INSERT a la BD y se generara el ID
                                bd.insert(vNameTabla, "idproyecto," + nombreFields, idproyecto + "," + idNuevo + "," + linea.substring(posInicial - 1, posFinal));
//                                System.out.println("<presupuesto>--No se encontro el ID--->INSERT INTO "+vNameTabla+" (idproyecto,"+nombreFields+") VALUES("+idproyecto+","+idNuevo+","+linea.substring(posInicial-1, posFinal)+")");
                            } else if (vNameTabla.equals("partida")) {
//                                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<linea>>>"+linea.substring(posInicial-1, posFinal));
                                int p1 = linea.lastIndexOf("','", posInicial - 4);
                                String id1 = linea.substring(p1 + 2, posInicial - 2);
//                                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<lastindexof>>>"+p1+">>>"+id1);
                                int p2 = linea.lastIndexOf("','", p1 - 2);
                                String id2 = linea.substring(p2 + 2, p1 + 1);
//                                System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<lastindexof>>>"+p2+">>>"+id2+">>>");
                                //INSERT a la BD y se generara el ID
                                bd.insert(vNameTabla, "idproyecto," + nombreFields, idproyecto + "," + vIdPresupuestoMap.get(id2) + "," + idNuevo + "," + linea.substring(posInicial - 1, posFinal));
//                                System.out.println("<partida>--No ID--->INSERT INTO "+vNameTabla+" (idproyecto,"+nombreFields+") VALUES("+idproyecto+","+vIdPresupuestoMap.get(id2) +","+idNuevo+","+linea.substring(posInicial-1, posFinal)+")");
                            } else if (vNameTabla.equals("partida_detalle")) {
                                //INSERT a la BD y se generara el ID
                                bd.insert(vNameTabla, "idproyecto," + nombreFields, idproyecto + "," + idNuevo + linea.substring(posInicial - 1, posFinal));
//                                System.out.println("<partida_detalle>No se encontro el ID--->INSERT INTO "+vNameTabla+" (idproyecto,"+nombreFields+") VALUES("+idproyecto+","+idNuevo+linea.substring(posInicial-1, posFinal)+")");
                            } else {
                                bd.insert(vNameTabla, "id" + vNameTabla + "," + nombreFields, idNuevo + "," + linea.substring(posInicial - 1, posFinal));
//                                System.out.println("<<<>--No se encontro el ID--->INSERT INTO "+vNameTabla+" (id"+vNameTabla+","+nombreFields+") VALUES("+idNuevo+","+linea.substring(posInicial-1, posFinal)+")");
                            }
                            //Obtenemos el id creado por la SW
                            if (idNuevo.equals("null")) {
                                idNuevo = "'" + selectBD(vNameTabla, "id" + vNameTabla, nombre + "'" + campoABuscar + "'") + "'";
//                                idNuevo="'MK"+iii+"'";
//                                iii++;
                            }
                            if (vNameTabla.equals("proyecto")) {
                                idproyecto = idNuevo;
                            }
//                            System.out.println(">>>>>>NO ID>>>>hashMap: "+idTableTXT+">>>"+idNuevo);
                            idTableHashMap = idNuevo;
                        }//Fin de idEncontradoBD null
//                        System.out.println(">>>HashMap.put("+idTableTXT+","+idTableHashMap+")");
                        hashMap.put(idTableTXT, idTableHashMap);
                    } else if (linea.indexOf("") != -1) {
                        nuevaTabla = false;
                    }//FIN DEL PRIMER IF
                }//FIN DEL WHILE
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                ClsException._exceptionWriteFile(e, "RecuperarArchivo_JFileChooser");
            }
        }
        return false;
    }
//___________________________________________________________________________________ Soy una barra separadora :)

    public Object[][] select(String table, String fields, String where) {
        nameColumnTable = "";
        //Permitira obtener la cantidad de registros de la consulta,
        //para poder determinar el array de objetos a devolver...
        registros = 0;
        String q = "SELECT " + fields + " FROM " + table;//Se encuentra la verdadera consulta
        String q2 = "SELECT count(*) as total FROM " + table;//Nos permite saber cuantos rows trae la consulta
        if (activarPaseFuncion) {
            q2 = sqlCount + table;
            activarPaseFuncion = false;
        }
        //Si la variable where no esta vacio, lo concadenamos a "q", para la consulta
        if (where != null) {
            q += " WHERE " + where;
            q2 += " WHERE " + where;
        }
//        System.out.println("sql->>>q: " + q);
        //obtenemos la cantidad de registros existentes en la tabla
        try {
            PreparedStatement pstm = bd.conn.prepareStatement(q2);
//            System.out.println("sql->>q2: " + q2);
            ResultSet res = pstm.executeQuery();
            res.next();
            registros = res.getInt("total");
            filasTotal = registros;
            res.close();
        } catch (SQLException e) {
            e.printStackTrace();
            ClsException._exceptionWriteFile(e, "select");
        }
//        System.out.println(">>>registros: " + registros);
        if (registros > 0) {
            //Realizamos la consulta sql y llenamos los datos en la matriz "Object"
            try {
                PreparedStatement pstm = bd.conn.prepareStatement(q);
                ResultSet res = pstm.executeQuery();
                ResultSetMetaData rsmd = res.getMetaData();
                n = rsmd.getColumnCount();
                //Se crea una matriz con tantas filas y columnas que necesite
                Object[][] data = new String[registros][n];
                String[] colname = new String[n];
                for (int i = 0; i < n; i++) {
                    if (i != 0) {
                        nameColumnTable += ",";
                    }
                    nameColumnTable += rsmd.getColumnName(i + 1);
                    colname[i] = rsmd.getColumnName(i + 1);
                }
                int i = 0;
                while (res.next()) {
                    for (int j = 0; j < n; j++) {
                        data[i][j] = res.getString(colname[j].trim());
                    }
                    i++;
                }
                res.close();
                return data;
            } catch (SQLException e) {
                e.printStackTrace();
                ClsException._exceptionWriteFile(e, "select");
            }
        }
        return null;
    }

    public String selectBD(String table, String fields, String where) {
        String q = "SELECT " + fields + " FROM " + table + " WHERE " + where;//Se encuentra la verdadera consulta
//        System.out.println("sql selectBD->q: " + q);
        try {
            PreparedStatement pstm = bd.conn.prepareStatement(q);
            ResultSet res = pstm.executeQuery();
            String result = "";
            while (res.next()) {
                result = res.getString("id" + vNameTabla);
                res.close();
                return result;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            ClsException._exceptionWriteFile(e, "selectBD");
        }
        return null;
    }
//___________________________________________________________________________________ Soy una barra separadora :)

    public String buscarHashMap(Map hashMap, String keyString) {
        Iterator it = hashMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            System.out.println("> " + e.getKey() + " <<>> " + e.getValue() + " <");
            if (e.getKey().equals(keyString)) {
//                System.err.println("-----------------------<<<<"+keyString+"<<<<<<<<<<<<Igualdad>>>"+e.getValue().toString());
                return e.getValue().toString();
            }
        }
        return null;
    }
//___________________________________________________________________________________ Soy una barra separadora :)

    public void setIDProyecto(Object idproyecto) {
        id = (String) idproyecto;
    }

    public void setDireccionDirectorioSalidaBackupDefecto(String direccionDirectorioSalidaString) {
        direccionDirectorioSalida = direccionDirectorioSalidaString;
    }

    public void setNombreArchivoPortable(String nombreArchivoPortableString) {
        nombreArchivoPortable = nombreArchivoPortableString;
    }

    public String getDireccionDirectorioSalidaBackupDefecto() {
        return direccionDirectorioSalida;
    }

    public String getNombreArchivoPortable() {
        return nombreArchivoPortable;
    }
}